/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import classes.ItensProduto;
import classes.Produto;
import classes.Saida;
import conexao.GerenciadorConexao;
import erro.ConexaoException;
import erro.ConsultaException;
import erro.DaoException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author George
 */
public class DaoSaida implements IDaoSaida {

    private GerenciadorConexao g;

    public DaoSaida() {
        g = GerenciadorConexao.getInstancia();
    }

    /**
     * Insere um novo registro no BD
     * @param saida
     * @throws ConexaoException
     * @throws DaoException
     */
    @Override
    public void inserir(Saida saida, ItensProduto ip, Produto prod) throws DaoException, ConexaoException {
        String sql = "INSERT INTO saida (codidentsaida, codproduto, numlote, qtdsaidaitens, datasaida)"
                + " VALUES (?,?,?,?,?)";

        String sqlIp = "update itensproduto set quantitens="
                + "(select (ip.quantitens - s.qtdsaidaitens) "
                + "from Saida s, itensproduto ip where ip.numlote=? and s.numlote=? and s.codidentsaida=?)"
                + " where numlote=?";

        String sqlProd = "UPDATE produto set estproduto="
                + "(select SUM(quantitens) from itensproduto WHERE codproduto=?) where codproduto=?";

        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            PreparedStatement pstmIp = g.connect().prepareStatement(sqlIp);
            PreparedStatement pstmProd = g.connect().prepareStatement(sqlProd);
            pstm.setString(1, saida.getCodidentsaida());
            pstm.setInt(2, saida.getCodProduto().getCodProduto());
            pstm.setString(3, saida.getNumLote());
            pstm.setInt(4, saida.getQtdSaidaItens());
            pstm.setString(5, saida.getDataSaida());
            pstm.executeUpdate();

            pstmIp.setString(1, ip.getNumLote());
            pstmIp.setString(2, ip.getNumLote());
            pstmIp.setString(3, saida.getCodidentsaida());
            pstmIp.setString(4, ip.getNumLote());
            pstmIp.executeUpdate();

            pstmProd.setInt(1, prod.getCodProduto());
            pstmProd.setInt(2, prod.getCodProduto());
            pstmProd.executeUpdate();

        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }
    
    @Override
    public void deletar(Saida saida, ItensProduto ip, Produto prod) throws ConexaoException, DaoException {
         String sqlIp = "update itensproduto set quantitens="
                + "(select (ip.quantitens + s.qtdsaidaitens) "
                + "from Saida s, itensproduto ip where ip.numlote=? and s.numlote=? and s.codidentsaida=?)"
                + " where numlote=?";
        String sql = "DELETE FROM saida where codidentsaida=?";
       
        String sqlProd = "UPDATE produto set estproduto="
                + "(select SUM(quantitens) from itensproduto WHERE codproduto=?) where codproduto=?";
        
        try {
            
            PreparedStatement pstmIp = (PreparedStatement) g.connect().prepareStatement(sqlIp);
            pstmIp.setString(1, ip.getNumLote());
            pstmIp.setString(2, saida.getNumLote());
            pstmIp.setString(3, saida.getCodidentsaida());
            pstmIp.setString(4, ip.getNumLote());
            pstmIp.executeUpdate();
            
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);
            pstm.setString(1, saida.getCodidentsaida());
            pstm.executeUpdate();
            
            PreparedStatement pstmProd = g.connect().prepareStatement(sqlProd);
            pstmProd.setInt(1, prod.getCodProduto());
            pstmProd.setInt(2, prod.getCodProduto());
            pstmProd.executeUpdate();
            
        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }

    @Override
    public List<Saida> pesquisarSaida(Saida saida) throws ConexaoException, ConsultaException {
        List<Saida> lista = new ArrayList<Saida>();
        Produto prod;

        String sql = "select s.codidentsaida, p.codproduto, p.descproduto, s.numlote, s.qtdsaidaitens, s.datasaida from Saida s "
                + "inner join Produto p on s.codproduto=p.codproduto where datasaida=?";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, saida.getDataSaida());
            ResultSet rs = pstm.executeQuery();
            while (rs.next()) {
                saida = new Saida();
                prod = new Produto();
                saida.setCodidentsaida(rs.getString("codidentsaida"));
                prod.setCodProduto(rs.getInt("codproduto"));
                prod.setDescProduto(rs.getString("descproduto"));
                saida.setCodProduto(prod);
                saida.setNumLote(rs.getString("numlote"));
                saida.setQtdSaidaItens(rs.getInt("qtdsaidaitens"));
                saida.setDataSaida(rs.getString("datasaida"));
                lista.add(saida);
            }
        } catch (SQLException ex) {
            throw new ConsultaException();
        } finally {
            g.disconnect();
        }
        return lista;
    }

    @Override
    public List<Saida> listarSaida() throws ConexaoException, ConsultaException {
        List<Saida> lista = new ArrayList<Saida>();
        Saida saida;
        Produto prod;
        String sql = "select s.codidentsaida, p.codproduto, p.descproduto, s.numlote, s.qtdsaidaitens, s.datasaida from Saida s "
                + "inner join Produto p on s.codproduto=p.codproduto order by datasaida";
        try {
            Statement stm = (Statement) g.connect().createStatement();
            ResultSet rs = stm.executeQuery(sql);

            while (rs.next()) {
                saida = new Saida();
                prod = new Produto();
                saida.setCodidentsaida(rs.getString("codidentsaida"));
                prod.setCodProduto(rs.getInt("codproduto"));
                prod.setDescProduto(rs.getString("descproduto"));
                saida.setCodProduto(prod);
                saida.setNumLote(rs.getString("numlote"));
                saida.setQtdSaidaItens(rs.getInt("qtdsaidaitens"));
                saida.setDataSaida(rs.getString("datasaida"));
                lista.add(saida);
            }
        } catch (SQLException ex) {
            throw new ConsultaException();
        } finally {
            g.disconnect();
        }
        return lista;
    }
}